<?php 
class ProjectsController extends AppController {  
  
  var $name     = 'Projects';
  var $helpers   = array('Html'); //TODO - helpers are in app_controller, not needed here
  var $uses     = array(
    'Project'
  );
  
  /* toto bude zaujimave, sem idu filtre*/
  public $paginate = array(
        'limit' => 10,
        'order' => array(
            'Project.id' => 'asc'
        )
    );
    
  function beforeFilter() {
      parent::beforeFilter();
	    $this->set('title_for_layout', 'Projekty');
      $this->Auth->allow('index', 'search', 'detail');
      $this->Auth->authorize = 'actions';
      if ($this->Session->read('Auth.User'))
       $this->Auth->allow('*');
       
       //ak ideme na inu akciu, ako search, zmazeme ulozene search data
       if($this->request->params['action'] != 'search') {
         $this->Session->delete('Search'); 
       }          
  }
  
  /**
   * Listovanie projektov
   * 
   * Za pomoci componentu „Pagination“ získa metóda príslušný počet záznamov typu „Project“ a pošle ich do view.
   * 
   */
  function index() {
    // neindexuj deletnute projekty, nutne aby sa paginator nepokazil pokial by som ich vynechal
    $this->paginate = array(
        'limit' => 10,
        'order' => array(
            'Project.id' => 'asc'
        ),
        'conditions' => array('Project.is_deleted' => 0),
    );  
    //ziskanie zaznamov
    if ($this->Cookie->read('limit'))
			$this->paginate['limit'] = $this->Cookie->read('limit');
    $data = $this->paginate('Project');
    $this->set('data', $data);
  }
  
  /**
   * Vyhľadávanie projektov
   * 
   * Ak nie sú poslané žiadne kritéria vyhľadávania, metóda sa správa rovnako, ako metóda „index“. 
   * Ak sú poslané kritéria vyhľadávania, tak metóda podľa nich za pomoci componentu 
   * „Pagination“ získa príslušný počet záznamov typu „Project“ a pošle ich do view.
   * 
   */
  function search() {
    // ziskanie zaznamov
    $conditions = array();
    
    // ak boli poslane post data, vyhladavame podla nich
    if (!empty($this->request->data)) {
      $search = $this->request->data;
      // search data zapiseme do session, aby sme podla nich mohli hladat aj pri listingu
      // search data sa vymazu, ked prejdeme na inu akciu (toto sa robi vo funkcii beforFilter)
      $this->Session->write('Search', $search);  
    }
    // ak nie su poslane post data, skusime ako search data pouzit data zo session
    elseif ($this->Session->check('Search')) {
      $search = $this->Session->read('Search');
    }
    else { 
      $search = array();
    }
    // pokial poslal default slovo "Hľadaj" tak ignoruj
    if(!empty($search) AND $search['search']=='Hľadaj')
      $search = array();
    // pokial sme nic nezaskrtli
    if(!empty($search) AND !$search['projectName'] AND !$search['annotation'] AND !$search['leaderName'])
      $search['projectName'] = true;
       
    // tato funkcia vypise vsetky post data, ktore boli poslane, staci odkomentovat a je vidiet, co prislo
    // debug($this->request->data);
    
    // na zaklade checkboxov pridavame podmienky
    // podrobne popisane v http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions
    // je tu pouzity OR a LIKE
    if (!empty($search)) {
      if ($search['projectName']) $conditions['OR'][] = array('Project.name LIKE' => '%'.$search['search'].'%');
      if ($search['annotation']) $conditions['OR'][] = array('Project.annotation LIKE' => '%'.$search['search'].'%');
      if ($search['leaderName']) $conditions['OR'][] = array('Leader.fullname LIKE' => '%'.$search['search'].'%'); 
    }

    // chceme hladat aj podla Person
    // $this->Project->recursive = -1;
    $joins = array(
        array('table' => 'people_projects',
            'alias' => 'PersonProject',
            'type' => 'inner',
            'conditions' => array(
                'Project.id = PersonProject.project_id'
            )
        ),
        array('table' => 'people',
            'alias' => 'Person',
            'type' => 'inner',
            'conditions' => array(
                'PersonProject.person_id = Person.id'
            )
        )
    );
        
    if (!($this->Session->check('Auth.User'))/* || (!empty($search) && !$search['is_deleted'])*/)
        $conditions['AND'][] = array('Project.is_deleted' => 0);
    /*else if(!empty($search) && $search['is_deleted'])
        $conditions['AND'][] = array('Project.is_deleted' => 1);*/
        
    /*if(!empty($search)) {
      $tmp_time = date('Y-m-d H:i:s');
      if($search['ended'])
          $conditions['AND'][] = array('Project.end <' => $tmp_time);
      else
          $conditions['AND'][] = array('Project.end >=' => $tmp_time);
          
      if($search['started'])
          $conditions['AND'][] = array('Project.start <' => $tmp_time);
      else
          $conditions['AND'][] = array('Project.start >=' => $tmp_time);          
    }*/
        
    // zavolame pagination s podmienkami
    $this->paginate = array(
          'limit' => 10,
          'order' => array(
              'Project.id' => 'asc'
          ),
          'conditions' => $conditions,
          'group' => 'Project.id',
          'joins' => $joins
      );
    
    // tu si mozme pozriet, ako vyzeraju OR conditions vo forme pola
    //debug($conditions);
    
    if ($this->Cookie->read('limit'))
		$this->paginate['limit'] = $this->Cookie->read('limit');  
      
    // posleme data do view
    $data = $this->paginate('Project');
    $this->set('data', $data);
  }
  
  /**
   * Zobrazenie detailu projektu
   * 
   * Ak nie je zadané id, metóda zavolá presmerovanie na metódu „index“. Ak je zadané id, 
   * metóda sa pokúsi získať záznam projektu s príslušným id. 
   * Ak záznam neexistuje, metóda zavolá presmerovanie na metódu „index“. 
   * Ak záznam existuje, metóda ho pošle do view. 
   * 
   * @param int id
   */
  function detail($id = null) {
    //skontroluje, ci je nastavene id
    if ($id == NULL) 
      $this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));
      
    $data = $this->Project->find('first', array(
        'conditions' => array('Project.id' => $id)));
    if($data == null)
      $this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));
          
    $this->set('data', $data);  
  }
  
  //ADMIN
  
  /**
   * Listing projektov 
   * 
   * Za pomoci componentu „Pagination“ získa metóda príslušný počet záznamov typu „Project“ a pošle ich do view.
   * 
   */
  function admin_list() {
    //ziskanie zaznamov
    if ($this->Cookie->read('limit'))
		$this->paginate['limit'] = $this->Cookie->read('limit'); 
    $data = $this->paginate('Project');
    $this->set('data', $data);
    //debug($data);
  }
  
  /**
   * Pridanie projektu
   * 
   * Ak nie sú poslané žiadne POST data, metóda načíta departments a people tabulky a zobrazí sa pridávací formulár. 
   * Ak sú poslané, metóda skontroluje, či sú dáta korektné. Táto kontrola zahŕňa aj kontrolu existencie katedry a osôb s menami, ktoré boli poslané. 
   * Ak neexistujú, metóda pre ne vytvorí na základe týchto mien nový záznam. 
   * Ak nie sú poslané údaje korektné, metóda o tom vygeneruje správu. 
   * Ak áno, uloží poslané údaje do databázy a vygeneruje správu o úspešnom pridaní záznamu. 
   * 
   */
  function admin_add() {
    // tato funkcia sa vola pred nacitanim danej stranky
    // teda pri kliknuti na "add" a pri kliknuti na "Save Projekt"
    unset($this->request->data['Project']['id']);
    // skontroluj ci boli poslane udaje
    if ($this->request->is('post')) {
      //kontrola poslanych udajov
      if (!empty($this->request->data)) {
        if ($this->Project->save($this->request->data))
          $this->Session->setFlash(PROJECT_ADDED, 'default', array());
        else
          $this->Session->setFlash(PROJECT_NOT_ADDED, 'default', array());
      }  
    }
  
    $departments = $this->Project->Department->find('list');
    $this->set('departments', $departments);
    //debug($departments);
    
    $people = $this->Project->Person->find('list');
    $this->set('people', $people);
    //debug($people);
        
  }
  
  /**
   * Editovanie projektu
   * 
   * Ak nie sú poslané žiadne POST data, ani id, metóda zavolá presmerovanie na metódu „admin_list“. 
   * Ak je poslané iba id, metóda získa z databázy záznam typu „Poject“ s príslušným id a odošle ho do view, 
   * ktorý zobrazí editovací formulár. Ak záznam s príslušným id neexistuje, metóda vygeneruje správu a zavolá presmerovanie na metódu „admin_list“. 
   * Ak sú poslané POST data, metóda skontroluje, či sú dáta korektné. Táto kontrola zahŕňa aj kontrolu existencie katedry a osôb s menami, ktoré boli poslané. 
   * Ak neexistujú, metóda pre ne vytvorí na základe týchto mien nový záznam. Ak nie sú dáta korektné, metóda o tom vygeneruje správu. 
   * Ak áno, uloží poslané údaje do databázy a vygeneruje správu o úspešnom uložení záznamu. 
   * 
   * 
   * @param int $id
   */
  function admin_edit($id = NULL) {
    //skontroluje, ci je nastavene id, alebo su poslane postdata
    if ($id == NULL && !empty($this->request->data)) 
      $this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));
        
    //ulozi poslane data
    if ($this->request->is('post')) {
      if ($this->Project->Save($this->request->data)) {
        //pri uspesnom ulozeni nastavime hlasku o uspesnoti a presmerujeme na listing projektov
        $this->Session->setFlash(PROJECT_EDITED, 'default', array());
        $this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));
      } 
      else
        //pri neuspesnom ulozeni nastavime hlasku o neuspesnosti
        $this->Session->setFlash(PROJECT_NOT_EDITED, 'default', array());
    }
    else {
      $departments = $this->Project->Department->find('list');
      $this->set('departments', $departments);
      //debug($departments);
      
      $people = $this->Project->Person->find('list');
      $this->set('people', $people);
      //debug($people);
      //nacitam project do $this->request->data, kde bude pristupny vo view
      $this->request->data = $this->Project->read(null, $id);
    }          
  }
  
  /**
   * Zmazanie projektu
   * 
   * Ak nie je poslané id, metóda zavolá presmerovanie na metódu „admin_list“. Ak je poslané id, metóda uloží záznam s hodnotou „is_deleted“ nastavenou na 1. 
   * Potom vygeneruje správu o úspešnosti a zavolá presmerovanie na referer. 
   * 
   * @param int $id
   */
  function admin_delete($id = NULL) {      
    //skontroluje, ci je nastavene id
    if ($id == NULL) 
      $this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));

    //$this->Project->read(null, $id);
    $proj = $this->Project->find('first', array(
        'conditions' => array('Project.id' => $id)));
     
    // mal by vratit null ked neexistuje zaznam
    if($proj == null)
      $this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));
    
    if($proj['Project']['is_deleted'] == 0) {
      //pokusime sa nastavit projekt ako vymazany
      $proj['Project']['is_deleted'] = 1;
      
      if ($this->Project->save($proj))
        //pri uspesnom zmazani nastavime hlasku o uspesnoti
        $this->Session->setFlash(PROJECT_DELETED1, 'default', array());
      else
        //pri neuspesnom zmazani nastavime hlasku o neuspesnosti
        $this->Session->setFlash(PROJECT_NOT_DELETED, 'default', array());
      
      //zavolame presmerovanie na listing userov
      $this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));        
    } else {
    	
    /*	TOTO NEROBIME, PROJEKT ZOSTAVA STALE V DB
      //pokusime sa vymazat usera z DB
      if ($this->Project->delete($id))
        //pri uspesnom zmazani nastavime hlasku o uspesnoti
        $this->Session->setFlash(PROJECT_DELETED2, 'default', array());
      else
        //pri neuspesnom zmazani nastavime hlasku o neuspesnosti
        $this->Session->setFlash(PROJECT_NOT_DELETED, 'default', array());
     */ 
    	$this->Session->setFlash(PROJECT_IS_DELETED, 'default', array());
      //zavolame presmerovanie na listing userov
      $this->redirect(array('admin' => true, 'controller' => 'projects', 'action' => 'list'));
     
    }
  }  
}
?>